#include <iostream>
#include "vector"
#include "algorithm"

using namespace std;

/*
 * 常用算法
 *      <algorithm>   STL算法头文件中最大一个，包括比较，交换，查找，遍历，赋值，修改
 *      <numeric>     体积很小，只包括了剑三数学运算的模板函数
 *      <functional>  定义了一些模板类，用以声明函数对象
 *
 *    for_each(iterator_begin, iterator_end, _func)      遍历容器
 *    transform(iterator_begin1, iterator_end1, iterator_begin2, _func)     搬运容器到另一个容器中
 */
void myPrint(int value){
    cout << value << " ";
}

class MyPrint02{
public:
    void operator()(int value){
        cout << value << " ";
    }
};

void test01(){
    vector<int> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }
    for_each(v.begin(), v.end(), myPrint);   // 回调函数
    cout << endl;
    cout << "-------------" << endl;
    for_each(v.begin(), v.end(), MyPrint02());   // 仿函数
}

class Transform{
public:
    int operator()(int v){
        return v;
    }
};

void test02(){
    cout << "===================" << endl;
    vector<int> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }
    vector<int> vTarget;
    vTarget.resize(v.size());  // 目标容器需要提前开辟空间
    transform(v.begin(), v.end(), vTarget.begin(),  Transform());
    for_each(vTarget.begin(), vTarget.end(), myPrint);
}

int main() {

    test01();

    test02();

    return 0;
}
